home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / sml_nj / 93src.lha / src / mips / mipsinstr.sml < prev    next >
Encoding:
Text File  |  1993-01-27  |  5.0 KB  |  171 lines

  1. structure MipsInstrSet = 
  2. struct
  3.  
  4.   val error = ErrorMsg.impossible
  5.  
  6.   datatype 'label info = INFO of {addrOf: 'label -> int, 
  7.                     nameOf: 'label->string}
  8.   (*
  9.    * satisfy ea requirements of cmachine
  10.    *)
  11.   abstype register = REGISTER of int
  12.   with
  13.        datatype register_rep = Reg' of int | Freg' of int
  14.        fun Reg i = REGISTER i
  15.        fun Freg i = REGISTER(i+32)
  16.        fun reg_rep (REGISTER i) = if i<32 then Reg' i else Freg' (i-32)
  17.        fun reg_eq(REGISTER r, REGISTER s) = r=s
  18.   end
  19.  
  20.   datatype 'label EA = Direct of register
  21.             | Immed of int
  22.              | ImmedLab of 'label
  23.  
  24.   val baseReg   = Reg 24
  25.   val limitReg  = Reg 19
  26.   val heapExhaustedReg = Reg 21
  27.   val maskReg = Reg 25
  28.   val allocReg  = Reg 23
  29.   val exnptrReg = Reg 30
  30.   val linkReg   = Reg 31
  31.  
  32.   datatype 'label sdi  
  33.     = SETBASEADDR of 'label * register
  34.     | LOADADDR    of register * 'label * int
  35.     | LOAD        of register * 'label * int
  36.     | LOADF       of register * 'label * int * register
  37.     | BRANCH      of bool * register * register * 'label * register * 'label
  38.     | BRANCH_COP1 of bool * 'label * register * 'label
  39.  
  40.   val constBaseRegOffset = 32764
  41.  
  42.  (* satisfy operand requirements of mips instruction set.
  43.   * memOpnd should require no more than 16 bits when computed.
  44.   *)
  45.   datatype 'label signedlabel = POSLAB of 'label | NEGLAB of 'label
  46.   type 'label labexp = 'label signedlabel * int
  47.   datatype 'label arithOpnd = Immed16Op of int 
  48.                      | RegOp of register
  49.                      | LabelOp of 'label labexp
  50.                      | HiLabOp of 'label labexp
  51.                      | LoLabOp of 'label labexp
  52.  
  53.   datatype 'label memOpnd = Immed16Off of int
  54.               | LabOff of 'label labexp 
  55.               | HiLabOff of 'label labexp
  56.                  | LoLabOff of 'label labexp
  57.  
  58.   datatype int5      = Int5 of int
  59.  
  60.   fun split i = let val hi = Bits.rshift(i,16) 
  61.             val lo = Bits.andb(i,65535)
  62.         in 
  63.             if lo < 32768 then (hi,lo) else (hi+1, lo-65536)
  64.         end
  65.  
  66.   fun chk_immed16 n =  let
  67.     exception Immed16
  68.       in  if n>= ~32768 andalso n<=65535 then n 
  69.       else (app System.Print.say
  70.           ["Immed16 constant too large ", makestring n, "\n"];
  71.         raise Immed16)
  72.       end
  73.  
  74.   fun labelValue (INFO{addrOf,...}) (POSLAB lab,k) = k + addrOf lab
  75.     | labelValue (INFO{addrOf,...}) (NEGLAB lab,k) = k - addrOf lab
  76.  
  77.   fun hiLabelValue info labexp = #1 (split (labelValue info labexp))
  78.   fun loLabelValue info labexp = #2 (split (labelValue info labexp))
  79.  
  80.   fun labBranchOff info (LabOff labexp) = let 
  81.     exception BranchOffset
  82.     val labOff = labelValue info labexp
  83.       in 
  84.       if labOff rem 4 <> 0 then raise BranchOffset
  85.       else labOff div 4
  86.       end
  87.     | labBranchOff _ _ = error "MipsInstrSet.labBranchOff: bad label"
  88.  
  89.   datatype 'label instruction 
  90.     = NOP
  91.  
  92.    (*
  93.     * compare instructions: 
  94.     *)
  95.     | SLT      of register * register * 'label arithOpnd
  96.     | SLTU     of register * register * 'label arithOpnd
  97.     | SLT_DOUBLE  of register * register 
  98.     | SEQ_DOUBLE  of register * register
  99.  
  100.    (*
  101.     * branch instructions.
  102.     * This list is incomplete as the other branch instructions
  103.     * are all span dependent.
  104.     *)
  105.     | JUMP     of register
  106.     | BLTZAL    of unit
  107.     | BEQ           of bool * register * register * 'label memOpnd
  108.     | BCOP1       of bool * 'label memOpnd
  109.  
  110.  
  111.    (* 
  112.     * Arithmetic instructions:
  113.     * arguments are (rd,rs,rt/immed) with the exception of sub (sigh).
  114.     *)
  115.     | ADD     of register * register * 'label arithOpnd
  116.     | ADDU    of register * register * 'label arithOpnd
  117.     | AND     of register * register * 'label arithOpnd
  118.     | OR     of register * register * 'label arithOpnd
  119.     | XOR     of register * register * 'label arithOpnd
  120.     | SUB     of register * register * register
  121.  
  122.     (* 
  123.      * integer mult and div related:
  124.      *)
  125.     | MULT     of register * register
  126.     | DIV     of register * register 
  127.     | MFLO     of register
  128.     | MFHI     of register
  129.     | BREAK    of int
  130.  
  131.    (* 
  132.     * Floating point arithmetic:
  133.     *)
  134.     | NEG_DOUBLE  of register * register 
  135.     | ABS_DOUBLE  of register * register 
  136.     | MUL_DOUBLE  of register * register * register 
  137.     | DIV_DOUBLE  of register * register * register 
  138.     | ADD_DOUBLE  of register * register * register 
  139.     | SUB_DOUBLE  of register * register * register 
  140.     | CVTI2D      of register * register
  141.     | MTC1      of register * register
  142.  
  143.    (* 
  144.     * Move pseudo-instruction :  move(dst,src)
  145.     *)
  146.     | MOV_DOUBLE  of register * register 
  147.  
  148.    (* Load and store instructions:
  149.     * arguments are: op(rd, base(offset))
  150.     *)
  151.     | LBU      of register * register * 'label memOpnd
  152.     | SB      of register * register * 'label memOpnd
  153.     | LW      of register * register * 'label memOpnd
  154.     | SW     of register * register * 'label memOpnd
  155.     | LWC1    of register * register * 'label memOpnd
  156.     | SWC1    of register * register * 'label memOpnd
  157.     | LUI     of register * 'label memOpnd
  158.  
  159.    (* 
  160.     * Shift instructions:
  161.     * arguments are: (rd,rs,shamt)
  162.     *)
  163.     | SLL of register * register * int5
  164.     | SLLV of register * register * register
  165.     | SRA of register * register * int5
  166.     | SRAV of register * register * register 
  167. end    
  168.  
  169.   
  170.  
  171.